package model;

import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Sejour implements Iterable<LigneSejour>{
	public static final long MILISEC_PER_DAY = 86400000;
	
	private int numConfirmation;
	private Set<LigneSejour> chambres;
	private Client client;

	public Sejour(int numConf, Chambre chambre, Date dateArr, Date dateDep, Client client){
		numConfirmation = numConf;
		chambres = new HashSet<LigneSejour>();
		this.client = client;
		chambres.add(new LigneSejour(chambre, dateArr, dateDep, numConf));
	}
	
	/**
	 * Verifie si pour ce sejour la chambre est disponible entre ces dates
	 * @param chambre la chambre a verifie
	 * @param dateArr
	 * @param dateDep
	 * @return true si ce sejour n'est pas a cette chambre ou elle est disponible, false
	 */
	public boolean chambreIsDisponible(Chambre chambre, Date dateArr, Date dateDep){
		boolean isDispo = true;
		
		for(LigneSejour itSej:chambres){
			if (!itSej.chambreIsDisponible(chambre, dateArr, dateDep)){
				isDispo = false;
			}
		}
		
		return isDispo;
	}
	
	public LigneSejour getAtIndex(int i){
		int compteur = 0;
		
		for (LigneSejour itLigne:chambres){
			if (compteur == i){
				return itLigne;
			}
			compteur++;
		}
		
		return null;
	}
	
	public Date getDepart(){
		Date tempDate = new Date(0);
		
		for (LigneSejour itLigne:chambres){
			if (tempDate.before(itLigne.getDepart())){
				tempDate = itLigne.getDepart();
			}
		}
		
		return tempDate;
	}
	
	public void remove(int index){
		chambres.remove(index);
	}
	
	/**
	 * ajoute une une ligne sejour pour la chambre aux dates fournies.
	 * @param chambre la chambre a ajouter
	 * @param dateArr 
	 * @param dateDep 
	 */
	public void addLigneSejour(Chambre chambre, Date dateArr, Date dateDep){
		chambres.add(new LigneSejour(chambre, dateArr, dateDep, numConfirmation));
	}

	public void modifierDateDepart(Date today) {
		
		for (LigneSejour itLigne:chambres){
			if (today.before(itLigne.getDepart())){
				itLigne.modifierDateDepart(today);
			}
		}
	}

	public Facture creeFacture() {
		return new Facture(this);
	}

	/**
	 * 
	 * @return le numConfirmation
	 */
	public int getNumConfirmation() {
		return numConfirmation;
	}
	
	/**
	 * @return le client
	 */
	public Client getClient() {
		return client;
	}
	
	@Override
	public Iterator<LigneSejour> iterator() {
		return chambres.iterator();
	}

	public long getCoutSejour() {
		long tempTotal = 0;
		
		for (LigneSejour itLigne:chambres){
			tempTotal += itLigne.getCoutSejour();
		}
		
		return tempTotal;
	}
}
